package com.example.pathtracker.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

import java.util.Set;

public class SPUtils {
    private static final String TAG = "SPUtils";
    public static final String SP_NAME = "path_tracker";
    private static SharedPreferences sp;
    private static final Gson gson = new Gson();

    /**
     * 初始化SharedPreferences
     */
    public static void init(Context context) {
        if (sp == null) {
            sp = context.getApplicationContext().getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
        }
    }

    /**
     * 保存数据
     */
    public static void put(Context context, String key, Object value) {
        if (context == null || TextUtils.isEmpty(key)) {
            return;
        }

        init(context);
        SharedPreferences.Editor editor = sp.edit();

        try {
            if (value == null) {
                editor.remove(key);
            } else if (value instanceof String) {
                editor.putString(key, (String) value);
            } else if (value instanceof Integer) {
                editor.putInt(key, (Integer) value);
            } else if (value instanceof Boolean) {
                editor.putBoolean(key, (Boolean) value);
            } else if (value instanceof Float) {
                editor.putFloat(key, (Float) value);
            } else if (value instanceof Long) {
                editor.putLong(key, (Long) value);
            } else if (value instanceof Set) {
                editor.putStringSet(key, (Set<String>) value);
            } else {
                // 对于其他类型，使用Gson序列化为JSON字符串
                editor.putString(key, gson.toJson(value));
            }
            editor.apply();
        } catch (Exception e) {
            Log.e(TAG, "Error saving to SharedPreferences", e);
        }
    }

    /**
     * 获取String类型数据
     */
    public static String getString(Context context, String key, String defaultValue) {
        init(context);
        return sp.getString(key, defaultValue);
    }

    /**
     * 获取int类型数据
     */
    public static int getInt(Context context, String key, int defaultValue) {
        init(context);
        return sp.getInt(key, defaultValue);
    }

    /**
     * 获取boolean类型数据
     */
    public static boolean getBoolean(Context context, String key, boolean defaultValue) {
        init(context);
        return sp.getBoolean(key, defaultValue);
    }

    /**
     * 获取float类型数据
     */
    public static float getFloat(Context context, String key, float defaultValue) {
        init(context);
        return sp.getFloat(key, defaultValue);
    }

    /**
     * 获取long类型数据
     */
    public static long getLong(Context context, String key, long defaultValue) {
        init(context);
        return sp.getLong(key, defaultValue);
    }

    /**
     * 获取Set<String>类型数据
     */
    public static Set<String> getStringSet(Context context, String key, Set<String> defaultValue) {
        init(context);
        return sp.getStringSet(key, defaultValue);
    }

    /**
     * 获取对象（通过Gson反序列化）
     */
    public static <T> T getObject(Context context, String key, Class<T> clazz) {
        init(context);
        String json = sp.getString(key, null);
        if (TextUtils.isEmpty(json)) {
            return null;
        }
        try {
            return gson.fromJson(json, clazz);
        } catch (JsonSyntaxException e) {
            Log.e(TAG, "Error deserializing object", e);
            return null;
        }
    }

    /**
     * 移除指定key的数据
     */
    public static void remove(Context context, String key) {
        init(context);
        sp.edit().remove(key).apply();
    }

    /**
     * 清除所有数据
     */
    public static void clear(Context context) {
        init(context);
        sp.edit().clear().apply();
    }

    /**
     * 判断是否包含某个key
     */
    public static boolean contains(Context context, String key) {
        init(context);
        return sp.contains(key);
    }

    /**
     * 获取所有键值对
     */
    public static java.util.Map<String, ?> getAll(Context context) {
        init(context);
        return sp.getAll();
    }


    public static <T> T getObject(Context context, String key, java.lang.reflect.Type typeOfT) {
        init(context);
        String json = sp.getString(key, null);
        if (TextUtils.isEmpty(json)) {
            return null;
        }
        try {
            return gson.fromJson(json, typeOfT);
        } catch (JsonSyntaxException e) {
            Log.e(TAG, "Error deserializing object", e);
            return null;
        }
    }




}
